package com.tool.cn.util;

import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.net.MalformedURLException;
import java.net.URL;

import javax.imageio.ImageIO;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.encryption.InvalidPasswordException;
import org.apache.pdfbox.text.PDFTextStripper;
import org.icepdf.core.pobjects.Document;
import org.icepdf.core.pobjects.Page;
import org.icepdf.core.util.GraphicsRenderingHints;

import com.lowagie.text.BadElementException;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Image;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.PdfWriter;

/**
 * pdf 工具类
 * 
 * @author wangzh 2016年9月19日 下午4:03:42
 */
public final class PdfUtil {

	private static final Log log = LogFactory.getLog(PdfUtil.class);

	/**
	 * 读取pdf文件
	 */
	public static Document readPdf(String url) {
		Document document = new Document();
		try {
			document.setFile(url);
			return document;
		} catch (Exception e) {
			log.error("文件路径不存在:" + e);
		}
		return null;
	}

	/**
	 * pdf文件转为图片
	 */
	public static boolean pdfToImage(Document document, String url) {
		float scale = 1.3f, rotation = 0f;
		for (int i = 0; i < document.getNumberOfPages(); i++) {
			BufferedImage image = (BufferedImage) document.getPageImage(i, GraphicsRenderingHints.SCREEN,
					Page.BOUNDARY_CROPBOX, rotation, scale);
			RenderedImage rendImage = image;
			try {
				File file = new File(url);
				ImageIO.write(rendImage, "png", file);

			} catch (IOException e) {
				log.error("生成图片失败" + e);
				return false;
			}
			image.flush();
		}
		document.dispose();
		return true;
	}

	/**
	 * 生成pdf
	 */
	public static boolean createPdf(String url) throws FileNotFoundException, DocumentException {

		com.lowagie.text.Document document = new com.lowagie.text.Document();

		PdfWriter.getInstance(document, new FileOutputStream(url));

		document.open();

		document.add(new Paragraph("Hello World"));

		document.close();

		return true;
	}

	/**
	 * pdf 转 txt
	 */
	public static void pdfToTxt(File file, String outputUrl) {
		// 是否排序
		boolean sort = false;
		String textFile = null;
		// 编码方式
		String encoding = "UTF-8";
		// 开始提取页数
		int startPage = 1;
		// 结束提取页数
		int endPage = Integer.MAX_VALUE;
		// 文件输入流，生成文本文件
		Writer output = null;
		// 内存中存储的PDF Document
		PDDocument document = null;
		try {
			document = PDDocument.load(file);
			if (file.length() > 4) {
				textFile = outputUrl + file.getName().substring(0, file.getName().length() - 4) + ".txt";
			}
			// 文件输入流，写入文件倒textFile
			output = new OutputStreamWriter(new FileOutputStream(textFile), encoding);
			// PDFTextStripper来提取文本
			PDFTextStripper stripper = new PDFTextStripper();
			// 设置是否排序
			stripper.setSortByPosition(sort);
			// 设置起始页
			stripper.setStartPage(startPage);
			// 设置结束页
			stripper.setEndPage(endPage);
			stripper.writeText(document, output);
		} catch (InvalidPasswordException e) {
			log.error(e);
		} catch (IOException e) {
			log.error(e);
		} finally {
			if (output != null) {
				try {
					output.flush();
					output.close();
				} catch (IOException e) {
					log.error(e);
				}
			}
			if (document != null) {
				try {
					document.close();
				} catch (IOException e) {
					log.error(e);
				}
			}
		}
	}

	/**
	 * 网络和本地pdf获取文件
	 */
	public static void readFdf(String file) throws Exception {
		// 是否排序
		boolean sort = false;
		// pdf文件名
		String pdfFile = file;
		// 输入文本文件名称
		String textFile = null;
		// 编码方式
		String encoding = "UTF-8";
		// 开始提取页数
		int startPage = 1;
		// 结束提取页数
		int endPage = Integer.MAX_VALUE;
		// 文件输入流，生成文本文件
		Writer output = null;
		// 内存中存储的PDF Document
		PDDocument document = null;
		try {
			try {
				// 首先当作一个URL来装载文件，如果得到异常再从本地文件系统//去装载文件
				URL url = new URL(pdfFile);
				// 注意参数已不是以前版本中的URL.而是File。
				document = PDDocument.load(new File(pdfFile));
				// 获取PDF的文件名
				String fileName = url.getFile();
				// 以原来PDF的名称来命名新产生的txt文件
				if (fileName.length() > 4) {
					File outputFile = new File(fileName.substring(0, fileName.length() - 4) + ".txt");
					textFile = outputFile.getName();
				}
			} catch (MalformedURLException e) {
				// 如果作为URL装载得到异常则从文件系统装载
				// 注意参数已不是以前版本中的URL.而是File。
				document = PDDocument.load(new File(pdfFile));
				if (pdfFile.length() > 4) {
					textFile = pdfFile.substring(0, pdfFile.length() - 4) + ".txt";
				}
			}
			// 文件输入流，写入文件倒textFile
			output = new OutputStreamWriter(new FileOutputStream(textFile), encoding);
			// PDFTextStripper来提取文本
			PDFTextStripper stripper = null;
			stripper = new PDFTextStripper();
			// 设置是否排序
			stripper.setSortByPosition(sort);
			// 设置起始页
			stripper.setStartPage(startPage);
			// 设置结束页
			stripper.setEndPage(endPage);
			// 调用PDFTextStripper的writeText提取并输出文本
			stripper.writeText(document, output);
		} finally {
			if (output != null) {
				// 关闭输出流
				output.close();
			}
			if (document != null) {
				// 关闭PDF Document
				document.close();
			}
		}
	}

	/**
	 * pdf 转 word
	 */
	public static void pdfToWord(File file, String outputUrl) {
		Writer writer = null;
		PDDocument doc = null;
		try {
			doc = PDDocument.load(file);
			int pagenumber = doc.getNumberOfPages();
			System.out.print("pages" + pagenumber);

			FileOutputStream fos = new FileOutputStream(outputUrl);
			writer = new OutputStreamWriter(fos, "UTF-8");
			PDFTextStripper stripper = new PDFTextStripper();

			stripper.setSortByPosition(true);// 排序
			// stripper.setWordSeparator("");//pdfbox对中文默认是用空格分隔每一个字，通过这个语句消除空格（视频是这么说的）
			stripper.setStartPage(3);// 设置转换的开始页
			stripper.setEndPage(7);// 设置转换的结束页
			stripper.writeText(doc, writer);

		} catch (InvalidPasswordException e) {
			log.error(e);
		} catch (FileNotFoundException e) {
			log.error(e);
		} catch (UnsupportedEncodingException e) {
			log.error(e);
		} catch (IOException e) {
			log.error(e);
		} finally {
			if (writer != null) {
				try {
					writer.close();
				} catch (IOException e) {
					log.error(e);
				}
			}
			if (doc != null) {
				try {
					doc.close();
				} catch (IOException e) {
					log.error(e);
				}
			}

		}
	}
	
	/**
	 * 
	 * @param imageFolderPath  图片存储目录
	 * @param pdfPath  PDF生成目录，包含PDF文件名
	 */
	public static void toPdf(String imageFolderPath, String pdfPath) {
		try {
			String imagePath = null;
			// 输入流
			File pdf = new File(pdfPath);
			if (!pdf.exists()) {
				pdf.createNewFile();
			}
			FileOutputStream fos = new FileOutputStream(pdfPath);
			// 创建文档
			com.lowagie.text.Document doc = new com.lowagie.text.Document(null, 0, 0, 0, 0);
			// doc.open();
			// 写入PDF文档
			PdfWriter.getInstance(doc, fos);
			// 读取图片流
			BufferedImage img = null;
			// 实例化图片
			Image image = null;
			// 获取图片文件夹对象
			File file = new File(imageFolderPath);
			File[] files = file.listFiles();

			for (File file1 : files) {
				if (file1.getName().endsWith(".png") || file1.getName().endsWith(".jpg")
						|| file1.getName().endsWith(".gif") || file1.getName().endsWith(".jpeg")
						|| file1.getName().endsWith(".tif")) {
					// System.out.println(file1.getName());
					imagePath = imageFolderPath + file1.getName();
					System.out.println(file1.getName());
					// 读取图片流
					img = ImageIO.read(new File(imagePath));
					// 根据图片大小设置文档大小
					doc.setPageSize(new Rectangle(img.getWidth(), img.getHeight()));
					// 实例化图片
					image = Image.getInstance(imagePath);
					// 添加图片到文档
					doc.open();
					doc.add(image);
				}
			}
			// 关闭文档
			doc.close();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (BadElementException e) {
			e.printStackTrace();
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}
}
